﻿/*
1、友元可以是函数也可以是类，使用方法是在类或函数的声明前加friend并放在友元类中，
那么这个函数或类就可以突破访问限定修饰符来访问友元类中私有成员
2、外部友元函数可以访问类中的私有成员，但它只是声明，不是该类的成员
3、友元函数可以在类定义的任何地方声明，不受访问修饰限定符的影响
4、一个函数可以是多个类的友元函数
5、友元类中的函数也可以是另一个类的友元函数，并可以访问这个类的私有成员
6、友元类的关系是单向的，不具有交换性，⽐如A类是B类的友元，但是B类不是A类的友元。
7、友元类关系不能传递，如果A是B的友元， B是C的友元，但是A不是C的友元。
8、有时提供了便利。但是友元会增加耦合度，破坏了封装，所以友元不宜多⽤。
*/
#include<iostream>
#include<iostream>
using namespace std;
// 前置声明，都则A的友元函数声明编译器不认识B
class B;
class A

{
	// 友元声明
	friend void func(const A & aa, const B & bb);
	private:
	int _a1 = 1;
	int _a2 = 2;
};
class B
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _b1 = 3;
	int _b2 = 4;
};
void func(const A& aa, const B& bb)
{
	cout << aa._a1 << endl;
	cout << bb._b1 << endl;
}
int main()
{
	A aa;
	B bb;
	func(aa, bb);
	return 0;
}